package br.unirio.octopus.servicos.implementacao;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import br.unirio.octopus.dados.RepositorioDeFase;
import br.unirio.octopus.dados.RepositorioDeJogo;
import br.unirio.octopus.dados.RepositorioDePais;
import br.unirio.octopus.dominio.Fase;
import br.unirio.octopus.dominio.GrupoDTO;
import br.unirio.octopus.dominio.Jogo;
import br.unirio.octopus.dominio.Pais;
import br.unirio.octopus.servicos.IServicoDeFase;
import br.unirio.octopus.util.GeradorDeClassificacaoDeFaseDeGrupos;

@Service
public class ServicoDeFase implements IServicoDeFase{

	@Autowired
	private RepositorioDeFase repositorioDeFases;

	@Autowired
	private RepositorioDeJogo repositorioDeJogos;
	
	@Autowired
	private RepositorioDePais repositorioDePaises;

	@Override
	public List<Fase> obterTodas()
	{
		return repositorioDeFases.obterTodos();
	}


	@Override
	public Fase obterFase(Integer idDaFase)
	{
		return repositorioDeFases.obterPorId(idDaFase);
	}

	@Transactional
	@Override
	public void alterar(Fase fase)
	{
		repositorioDeFases.alterar(fase);
		
	}


	@Transactional
	@Override
	public void fecharFase(Integer idDaFase)
	{
		Fase atual = repositorioDeFases.obterPorId(idDaFase);
		if (atual.getNome().compareTo(Fase.Fases.GRUPOS.getNome()) == 0)
		{
			fecharFaseDeGrupos(atual);
		}
		if (atual.getNome().compareTo(Fase.Fases.OITAVAS.getNome()) == 0)
		{
			fecharFaseMataMata(49, 56, "V");
		}
		if (atual.getNome().compareTo(Fase.Fases.QUARTAS.getNome()) == 0)
		{
			fecharFaseMataMata(57, 60, "V");
		}
		if (atual.getNome().compareTo(Fase.Fases.SEMIFINAL.getNome()) == 0)
		{
			fecharFaseTerceiro();
		}
		if (atual.getNome().compareTo(Fase.Fases.TERCEIRO.getNome()) == 0)
		{
			fecharFaseMataMata(61, 62, "V");
		}
		atual.setAberto(0);
		if (atual.getProxima() != null)
		{
			atual.getProxima().setAberto(1);
		}		
		repositorioDeFases.alterar(atual);	
		
	}

	
	private void fecharFaseTerceiro() {
		Jogo jogoDeTerceiro = repositorioDeJogos.obterPorDescricao("P61");
		
		Jogo jogo61 = repositorioDeJogos.obterPorId(61);
		Jogo jogo62 = repositorioDeJogos.obterPorId(62);
		
		jogoDeTerceiro.setPais1(jogo61.getPerdedor());
		jogoDeTerceiro.setPais2(jogo62.getPerdedor());
		
		repositorioDeJogos.alterar(jogoDeTerceiro);
	}


	private void fecharFaseMataMata(int inicio, int fim, String resultado)
	{
		for(int i=inicio; i<=fim; i=i+2)
		{
			int aux = i;
			Jogo v1 = repositorioDeJogos.obterPorId(aux);
			Jogo v2 = repositorioDeJogos.obterPorId(++aux);
			Jogo jogo = repositorioDeJogos.obterPorDescricao(resultado+i);
			jogo.setPais1(v1.getVencedor());
			jogo.setPais2(v2.getVencedor());
			repositorioDeJogos.alterar(jogo);
		}		
	}
	
	public void fecharFaseDeGrupos(Fase fase)
	{
		GeradorDeClassificacaoDeFaseDeGrupos gerador = new GeradorDeClassificacaoDeFaseDeGrupos();
		List<GrupoDTO> dtoDeGrupos = gerador.fecharFase(repositorioDeJogos.obterJogosDaFase(fase));
		
		
		for (GrupoDTO grupoDTO : dtoDeGrupos)
		{
			imprime(grupoDTO);
			switch (grupoDTO.getId())
			{
			case 1:
				alterarPelaDescricao("1A", grupoDTO.obterPrimeiroLugarDoGrupo().getIdPais());
				alterarPelaDescricao("2A", grupoDTO.obterSegundoLugarDoGrupo().getIdPais());
				break;
			case 2:
				alterarPelaDescricao("1B", grupoDTO.obterPrimeiroLugarDoGrupo().getIdPais());
				alterarPelaDescricao("2B", grupoDTO.obterSegundoLugarDoGrupo().getIdPais());
				break;
			case 3:
				alterarPelaDescricao("1C", grupoDTO.obterPrimeiroLugarDoGrupo().getIdPais());
				alterarPelaDescricao("2C", grupoDTO.obterSegundoLugarDoGrupo().getIdPais());
				break;
			case 4:
				alterarPelaDescricao("1D", grupoDTO.obterPrimeiroLugarDoGrupo().getIdPais());
				alterarPelaDescricao("2D", grupoDTO.obterSegundoLugarDoGrupo().getIdPais());
				break;
			case 5:
				alterarPelaDescricao("1E", grupoDTO.obterPrimeiroLugarDoGrupo().getIdPais());
				alterarPelaDescricao("2E", grupoDTO.obterSegundoLugarDoGrupo().getIdPais());
				break;
			case 6:
				alterarPelaDescricao("1F", grupoDTO.obterPrimeiroLugarDoGrupo().getIdPais());
				alterarPelaDescricao("2F", grupoDTO.obterSegundoLugarDoGrupo().getIdPais());
				break;
			case 7:
				alterarPelaDescricao("1G", grupoDTO.obterPrimeiroLugarDoGrupo().getIdPais());
				alterarPelaDescricao("2G", grupoDTO.obterSegundoLugarDoGrupo().getIdPais());
				break;
			case 8:
				alterarPelaDescricao("1H", grupoDTO.obterPrimeiroLugarDoGrupo().getIdPais());
				alterarPelaDescricao("2H", grupoDTO.obterSegundoLugarDoGrupo().getIdPais());
				break;
			}
		}
		
	}


	private void alterarPelaDescricao(String descricao, Integer idPais)
	{
		Jogo jogo = repositorioDeJogos.obterPorDescricao(descricao);
		Pais pais = repositorioDePaises.obterPorId(idPais);		
		if (jogo.getDescricaoPais1().compareTo(descricao)==0)
		{
			jogo.setPais1(pais);
		}
		else
		{
			jogo.setPais2(pais);
		}
		repositorioDeJogos.alterar(jogo);
		
	}

	public void imprime(GrupoDTO dto){
		System.out.println("--------------PRIMEIRO LUGAR GRUPO "+ dto.obterPrimeiroLugarDoGrupo().getNumeroGrupo() +" : "+ dto.obterPrimeiroLugarDoGrupo().getIdPais()
				+ " - PONTOS : "+ dto.obterPrimeiroLugarDoGrupo().getPontos() + " - SALDO : "+ dto.obterPrimeiroLugarDoGrupo().getSaldo());
		System.out.println("--------------SEGUNDO LUGAR GRUPO "+ dto.obterSegundoLugarDoGrupo().getNumeroGrupo() +" : "+ dto.obterSegundoLugarDoGrupo().getIdPais()
				+ " - PONTOS : "+ dto.obterSegundoLugarDoGrupo().getPontos() + " - SALDO : "+ dto.obterSegundoLugarDoGrupo().getSaldo());
		
		
	}
	
}
